package services;

import java.sql.Date;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import model.*;

final public class ReportesServicio {

	public static boolean validarFecha(Date fecha_inicio, Date fecha_fin) {
		boolean valido = true;
		if (fecha_inicio.after(fecha_fin))
			valido = false;

		return valido;
	}

	// Comision por Ventas //

	public static Integer calcularCantidadVentasVendedor(Integer dni, List<Venta> ventas,
			Date fecha_inicio, Date fecha_fin) {
		Integer cantidad_ventas = 0;
		for (Venta venta : ventas) {

			if (venta.getEmpleado().getDni().equals(dni)) {

				if (venta.getFecha().after(fecha_inicio) || venta.getFecha().equals(fecha_inicio)) {
					if (venta.getFecha().before(fecha_fin) || venta.getFecha().equals(fecha_fin)) {
						cantidad_ventas += 1;
					}

				}

			}

		}
		return cantidad_ventas;
	}
	public static Integer calcularMontoComisionPorVentas(Integer cantidad,
			List<Comision> comisiones) {
		Integer adicional = 0;

		for (Comision comision : comisiones) {
			if (cantidad >= 1 && cantidad <= 5) {
				if (comision.getCategoria().equals("Comision por ventas - Entre 1 y 5 ventas"))
					adicional = comision.getValor();
			}
			if (cantidad >= 6 && cantidad <= 10) {
				if (comision.getCategoria().equals("Comision por ventas - Entre 6 y 10 ventas"))
					adicional = comision.getValor();

			}
			if (cantidad >= 11 && cantidad <= 15) {
				if (comision.getCategoria().equals("Comision por ventas - Entre 11 y 15 ventas"))
					adicional = comision.getValor();

			}
			if (cantidad >= 16) {
				if (comision.getCategoria().equals("Comision por ventas - Mas de 15 ventas"))
					adicional = comision.getValor();

			}
		}

		return adicional;
	}

	// Comision por Productos // // Comision por Productos //

	public static List<Resultados> comisionPorProductosResultado(List<Resultados> res,
			List<Venta> ventas, List<Producto> productos, List<VentaXProductos> ventasXcantidades) {
		for (int i = 0; i < res.size(); i++) {
			for (Producto producto : productos) {
				Integer cantidad = ReportesServicio.calcularComisionPorProductos(
						res.get(i).getDni(), ventas, producto.getProductoID(), ventasXcantidades);

				if (cantidad > 0) {

					Resultados res_temp = res.get(i);
					Integer comision = producto.getAdicional() * cantidad;
					res_temp.setComision(res_temp.getComision() + comision);
					System.out.println("---- Comision $$$ " + res_temp.getComision() + " ( "
							+ cantidad + " * " + producto.getAdicional() + " ) ");
					res.set(i, res_temp);
				}
			}
		}

		return res;

	}
	public static Integer calcularComisionPorProductos(Integer dni, List<Venta> ventas,
			Integer productoID, List<VentaXProductos> ventasXcantidades) {

		Integer cantidad_ventas = 0;
		for (Venta venta : ventas) {
			if (venta.getEmpleado().getDni().equals(dni)) {

				for (VentaXProductos vtx : ventasXcantidades) {
					if (vtx.getVenta().getFacturaID().equals(venta.getFacturaID())) {
						if (vtx.getProducto().getProductoID().equals(productoID)) {
							cantidad_ventas += vtx.getCantidad();
							System.out.println("FacturaID: " + vtx.getVenta().getFacturaID()
									+ " Cantidad: " + cantidad_ventas + " Producto: "
									+ vtx.getProducto().getNombre());

						}
					}
				}

			}
		}

		return cantidad_ventas;
	}

	// Premio mejor vendedor del mes //

	public static Empleado calcularPremioMejorVendedorMes(List<Venta> ventas,
			List<Empleado> empleados, Date fecha) {
		Empleado mejor_empleado = new Empleado();
		Integer mayor_cantidad = 0;
		Integer calculo_cantidad_ventas = 0;
		for (Empleado empleado : empleados) {
			if (empleado.getCategoria().equals("Vendedor")) {
				calculo_cantidad_ventas = ReportesServicio
						.calcularCantidadVentasVendedorPorMes(empleado.getDni(), ventas, fecha);
				if (mayor_cantidad < calculo_cantidad_ventas) {
					mayor_cantidad = calculo_cantidad_ventas;
					mejor_empleado = empleado;
				}
			}
		}

		return mejor_empleado;
	}
	public static Integer calcularCantidadVentasVendedorPorMes(Integer dni, List<Venta> ventas,
			Date fecha) {
		Integer cantidad_ventas = 0;
		Calendar cal_1 = Calendar.getInstance();
		Calendar cal_2 = Calendar.getInstance();
		cal_1.setTime(fecha);
		Integer fecha_comparacion = cal_1.get(Calendar.MONTH);

		for (Venta venta : ventas) {
			cal_2.setTime(venta.getFecha());
			Integer fecha_venta = cal_2.get(Calendar.MONTH);

			if (fecha_venta.equals(fecha_comparacion)) {
				if (venta.getEmpleado().getDni().equals(dni)) {
					cantidad_ventas += 1;
				}

			}
		}
		return cantidad_ventas;
	}
	public static List<Resultados> premioMejorVendedorResultado(List<Resultados> res,
			Empleado mejor_mes_empleado, Integer adicional) {

		for (int i = 0; i < res.size(); i++) {
			if (res.get(i).getDni() == mejor_mes_empleado.getDni()) {
				Resultados res_temp2 = res.get(i);
				res_temp2.setPremio(res_temp2.getPremio() + adicional);
				break;
			}
		}

		return res;

	}

	// Premios por productos //
	public static List<Resultados> premioPorProductoResultado(List<Producto> productos,
			Integer adicional, List<Resultados> res, List<Venta> ventas, List<Empleado> empleados,
			List<VentaXProductos> ventasXcantidades, Date fecha) {

		for (Producto producto : productos) {
			Empleado mejor_producto_empleado = ReportesServicio.calcularPremioMejorVendedorProducto(
					ventas, empleados, producto.getProductoID(), ventasXcantidades, fecha);

			for (int j = 0; j < res.size(); j++) {
				if (res.get(j).getDni() == mejor_producto_empleado.getDni()) {
					Resultados res_temp2 = res.get(j);
					res_temp2.setPremio(res_temp2.getPremio() + adicional);
					res.set(j, res_temp2);
				}
			}
		}

		return res;

	}
	public static Empleado calcularPremioMejorVendedorProducto(List<Venta> ventas,
			List<Empleado> empleados, Integer producto_id, List<VentaXProductos> ventasXcantidades,
			Date fecha) {
		Empleado mejor_empleado = new Empleado();
		Integer mayor_cantidad = 0;
		Integer calculo_cantidad_ventas = 0;

		for (Empleado empleado : empleados) {
			if (empleado.getCategoria().equals("Vendedor")) {
				calculo_cantidad_ventas = ReportesServicio
						.calcularCantidadVentasVendedorPorProducto(empleado.getDni(), ventas,
								producto_id, ventasXcantidades, fecha);

				if (mayor_cantidad < calculo_cantidad_ventas) {
					mayor_cantidad = calculo_cantidad_ventas;
					mejor_empleado = empleado;
				}
			}
		}

		return mejor_empleado;
	}
	public static Integer calcularCantidadVentasVendedorPorProducto(Integer dni, List<Venta> ventas,
			Integer producto_id, List<VentaXProductos> ventasXcantidades, Date fecha) {
		Integer cantidad_ventas = 0;

		Calendar cal_1 = Calendar.getInstance();
		Calendar cal_2 = Calendar.getInstance();
		cal_1.setTime(fecha);
		Integer fecha_comparacion = cal_1.get(Calendar.MONTH);

		for (Venta venta : ventas) {
			cal_2.setTime(venta.getFecha());
			Integer fecha_venta = cal_2.get(Calendar.MONTH);
			if (fecha_venta.equals(fecha_comparacion)) {
				if (venta.getEmpleado().getDni().equals(dni)) {

					for (VentaXProductos vtx : ventasXcantidades) {
						if (vtx.getVenta().getFacturaID().equals(venta.getFacturaID())) {
							if (producto_id.equals(vtx.getProducto().getProductoID())) {
								cantidad_ventas += vtx.getCantidad();
							}
						}
					}
				}
			}

		}
		return cantidad_ventas;
	}

}
